package QianFeng04;
/**抽象类：使用abstract关键字声明的类为抽象类
 * (1)很多具有相同特征和行为的对象可以抽象为一个类，很多具有相同特征和行为的类可以抽家为一个抽家类。
 * (2)使用abstract关键字声明的类为抽象类。
 *
 * 抽象类的规则:
 * 1、抽象类可以没有抽象方法，有抽象方法的类必须是抽象类
 * 2、非抽象类继承抽象类必须实现所有抽象方法
 * 3、抽象类可以继承抽象类，可以不实现父类抽象方法。
 * 4、抽象类可以有方法实现和属性
 * 5、抽象类不能被实例化
 * 6、抽象类不能声明为final（final定义的类不能被继承）
 * 7、抽象类可以有构造方法（在继承的关系里面，调用父类不一定是new对象（实例化），可以是初始化参数）
 **/
public class Test4 {
    public static void main(String[] args) {
        Man man = new Man();
        man.eat();
        man.move();

        Woman woman = new Woman();
        woman.eat();
        woman.move();

        //Animal a = new Animal();  抽象类不能实例化，只能继承
    }
}

abstract class Animal{
    public abstract void move();//方法的声明，抽象方法只有声明，没有实现
}

abstract class Person extends Animal{
    public abstract void eat();//方法的声明，抽象方法只有声明，没有实现
    //抽象类可以有方法和属性
    public void sleep(){
        System.out.println("人会睡觉");
    }
}

class Man extends Person{
    //非抽象类必须要实现抽象类的抽象方法 eat 和 move
    public void eat(){
        System.out.println("我是男人，我爱吃肉");
    }
    public void move(){
        System.out.println("我是男人，我喜欢跑步");
    }
}

class Woman extends Person{
    public void eat(){
        System.out.println("我是女人，我爱吃水果");
    }
    public void move(){
        System.out.println("我是女人，我喜欢逛街");
    }
}